/*-------------------------------------------------------------------------
 *
 * windowapi.h
 *	  提取窗口数据的窗口函数 API
 *
 * 窗口函数不会以正常方式接收其参数
 * （因此严格性的概念不相关）。相反，它接收一个“WindowObject”，
 * 可以通过 PG_WINDOW_OBJECT() 获取（注意必须使用 V1 调用约定）。
 * 正确的调用上下文可以通过 WindowObjectIsValid() 进行测试。
 * 虽然参数值没有传递，但调用已正确设置，以便
 * 可以使用 PG_NARGS()，并且参数类型信息可以通过
 * get_fn_expr_argtype(), get_fn_expr_arg_stable() 等获取。
 *
 * 对 WindowObject 的操作允许窗口函数获取当前行号、分区中的总行数等
 * 并在窗口分区中的不同行评估其参数表达式。有关详细信息，请参阅
 * nodeWindowAgg.c 中每个 WindowObject API 函数的头部注释。
 *
 *
 * Portions Copyright (c) 2000-2022, PostgreSQL Global Development Group
 *
 * src/include/windowapi.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef WINDOWAPI_H
#define WINDOWAPI_H

/* "seektype" 的值 */
#define WINDOW_SEEK_CURRENT 0
#define WINDOW_SEEK_HEAD 1
#define WINDOW_SEEK_TAIL 2

/* 这个结构在 nodeWindowAgg.c 中是私有的 */
typedef struct WindowObjectData *WindowObject;

#define PG_WINDOW_OBJECT() ((WindowObject) fcinfo->context)

#define WindowObjectIsValid(winobj) \
	((winobj) != NULL && IsA(winobj, WindowObjectData))

extern void *WinGetPartitionLocalMemory(WindowObject winobj, Size sz);

extern int64 WinGetCurrentPosition(WindowObject winobj);
extern int64 WinGetPartitionRowCount(WindowObject winobj);

extern void WinSetMarkPosition(WindowObject winobj, int64 markpos);

extern bool WinRowsArePeers(WindowObject winobj, int64 pos1, int64 pos2);

extern Datum WinGetFuncArgInPartition(WindowObject winobj, int argno,
									  int relpos, int seektype, bool set_mark,
									  bool *isnull, bool *isout);

extern Datum WinGetFuncArgInFrame(WindowObject winobj, int argno,
								  int relpos, int seektype, bool set_mark,
								  bool *isnull, bool *isout);

extern Datum WinGetFuncArgCurrent(WindowObject winobj, int argno,
								  bool *isnull);

#endif							/* WINDOWAPI_H */
